<?php

use think\app\Url;
use think\facade\Db;
// 应用公共文件
if (!function_exists("stringUrl")) {
    function stringUrl(string $url = '', array $vars = [], $suffix = true, $domain = false): string
    {
        return (string) url($url, $vars, $suffix, $domain);
    }
}
if (!function_exists("dd")) {
    function dd($args)
    {
        dump($args);
        die;
    }
}
if (!function_exists("getLastSql")) {
    function getLastSql()
    {
        return Db::getLastSql();
    }
}
if (!function_exists("array_recursive_merge")) {
    /**
     * 递归合并并覆盖数组
     * @param array $array1
     * @param array $array2
     * @return array
     */
    function array_recursive_merge(array $array1, array $array2): array
    {
        $merged = $array1;

        foreach ($array2 as $key => $value) {
            // 如果是数组且两个数组中都存在该键，则递归合并
            if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
                $merged[$key] = array_recursive_merge($merged[$key], $value);
            } else {
                // 否则直接覆盖
                $merged[$key] = $value;
            }
        }

        return $merged;
    }
}
if (!function_exists("format_file_size")) {

    /**
     * 格式化文件大小，根据大小自动选择合适的单位
     * 
     * @param int $bytes 文件大小，单位为字节(B)
     * @param int $decimals 保留的小数位数
     * @return string 格式化后的文件大小字符串
     */
    function format_file_size($bytes, $decimals = 2)
    {
        // 定义单位数组
        $units = array('B', 'KB', 'MB', 'GB', 'TB');

        // 如果文件大小为0，直接返回0和单位B
        if ($bytes == 0) {
            return '0 ' . $units[0];
        }

        // 计算最合适的单位级别
        $exp = floor(log($bytes, 1024));

        // 确保单位不超过定义的范围
        $exp = min($exp, count($units) - 1);

        // 计算转换后的值并保留指定小数位数
        $value = round($bytes / pow(1024, $exp), $decimals);

        // 返回格式化后的字符串
        return $value . ' ' . $units[$exp];
    }
}
